const createError = require("http-errors");
const express = require("express");
const path = require("path");
// var cookieParser = require("cookie-parser");
const session = require("express-session");
const MySQLStore = require("connect-mysql")(session);
const logger = require("morgan");
const dbConfig = require("./util/dbConfig");
const indexRouter = require("./routes/index");
const usersRouter = require("./routes/users");
const app = express();
const http = require("http");
const server = http.createServer(app);
// 引入并执行webScoket功能
require('./controllers/webSocket')

app.use(express.urlencoded({ extended: false }));
app.use(
  session({
    /*   1、cookie数据存放在客户的浏览器上，session数据放在服务器上。
  
    2、cookie不是很安全，别人可以分析存放在本地的cookie并进行cookie欺骗，考虑到安全应当使用session。
  
    3、session会在一定时间内保存在服务器上。当访问增多，会比较占用你服务器的性能，考虑到减轻服务器性能方面，应当使用cookie。
  
    4、单个cookie保存的数据不能超过3K，很多浏览器都限制一个站点最多保存20个cookie。
  
    5、可以考虑将登陆信息等重要信息存放为session，其他信息如果需要保留，可以放在cookie中。 */
    //配置session
    secret: "pzk", //秘钥
    saveUninitialized: false,
    resave: true, // 强制存储 即使没有修改，用作持久化，更新重置时间
    name: "session",
    cookie: { maxAge: 1000 * 20 }, //存储cookie
    rolling: true, // 是否重置存储时间
    // store: new MySQLStore({
    //   // 持久化，将session存储至mysql
    //   pool: dbConfig.mysql.createPool({
    //     // host: "192.168.34.90",
    //     user: "exapp",
    //     password: "123456",
    //     database: "exapp",
    //   }),
    // }),
  })
);
// app.use(cookieParser());

app.use(express.static(path.join(__dirname, "public")));

// 开放res路径资源 http://localhost:3000/res/image/man.png 直接访问
app.use("/res/", express.static("./res/"));
// 应用级别'全局'中间件，任何请求均会执行此处操作
app.use((req, res, next) => {
  // console.log(req.hostname);//获取主机名
  // console.log(req.ip); //获取IP

  console.log(logsucc("ALL Middleware"));
  // next()表示执行下一步操作
  next();
});
// 路由级别中间件，指定路由会执行此处操作 无视请求类型
app.use("/getCode", (res, req, next) => {
  console.log("路由中间件--1");
  next();
});
// 路由中间件，指定路由且仅支持post或get请求类型
app.post("/getCode", (res, req, next) => {
  console.log("post类型中间件--2"); 
});
app.use("/", indexRouter);
app.use("/users", usersRouter);
// view engine setup
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'jade');

// app.use(logger('dev'));
// app.use(express.json());
// catch 404 and forward to error handler

app.use(function (req, res, next) {
  // 中间件，页面提示报错信息
  next(createError(404));
});



// error handler  错误中间件
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  // res.locals.message = err.message;
  // res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  // res.status(err.status || 500);
  // res.render('error');
  console.log(logwarn("ERR Middleware"));
  res.status(err.status || 500);
  res.send({
    msg: err.msg,
    err: err.err || false,
  });
});
let serveport = "3000";
server.listen(serveport, () => {
  // 获取本地IP
  function getIPAdress() {
    var interfaces = require("os").networkInterfaces();
    for (var devName in interfaces) {
      var iface = interfaces[devName];
      for (var i = 0; i < iface.length; i++) {
        var alias = iface[i];
        if (
          alias.family === "IPv4" &&
          alias.address !== "127.0.0.1" &&
          !alias.internal
        ) {
          return alias.address;
        }
      }
    }
  }
  console.log(logcyan(getIPAdress() + ":" + serveport));
  // 通过ip指定mysql config
  dbConfig.ipConfig(getIPAdress());
  // 创建数据表并生成相应字段
  dbConfig.createTableFun();
  countRows = 0; //全局定义，初始化时获取并赋值users表总行数
});
